const settings = require('../../../settings')
const { noop, warn, success } = require('../../../src/core/common')
const SaveDataMgr = require('../../../src/lib/save-data/manager')

// 策略模式
const optionsHandlers = {
  init: {
    handler() {
      warn(`初始化游戏【${this.gameName}】存档`)
      this.pull(true)
    }
  },
  push: {
    handler() {
      warn(`上传游戏【${this.gameName}】存档`)
      this.push()
    }
  },
  pull: {
    handler() {
      warn(`下载游戏【${this.gameName}】存档`)
      this.pull()
    }
  },
  reset: {
    handler() {
      warn(`重置游戏【${this.gameName}】存档`)
      this.reset()
    }
  }
}

/**
 *  sync 命令
 */
function syncHandler(program) {
  program
    .command('sync [game_name]')
    .description('同步游戏存档')
    .option('-i, --init', '初始化游戏存档', false)
    .option('--push', '上传游戏存档', false)
    .option('--pull', '下载游戏存档', true)
    .option('-r, --reset', '重置最新游戏存档', false)
    .action(async (gameName, options) => {
      // 如果没有指定游戏名，则同步所有游戏
      const gameNames = gameName ? [gameName] : [...Object.keys(settings)]

      // option 最多只有一个，如果有多个，则只执行第一个
      const optionName = [
        options.push ? 'push' : undefined,
        options.init ? 'init' : undefined,
        options.pull ? 'pull' : undefined,
        options.reset ? 'reset' : undefined
      ].filter((o) => o)[0]

      // 如果没有指定操作，则默认下载游戏存档
      const optHandler = optionsHandlers[optionName].handler || noop
      gameNames.forEach((gameName) =>
        optHandler.call(new SaveDataMgr(gameName))
      )

      success(`完成`)
    })
}

module.exports = syncHandler
